#include "TcpServer.hpp"
#include "Log.hpp"
#include "InetAddr.hpp"
#include "ThreadPool.hpp"
#include <memory>
#include <functional>
using namespace kzz;

using task_t = std::function<void()>;

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        kzz::LOG(LogLevel::ERROR) << "服务器端参数传入错误";
        return 2;
    }
    uint16_t port = std::stoi(argv[1]);
    //顶层
    std::unique_ptr<kzz::Cal> cal=std::make_unique<kzz::Cal>();
    //协议层
   std::unique_ptr<kzz::Protocol> pro=std::make_unique<kzz::Protocol>(
    [&cal](kzz::Request& req){
      return cal->Execute(req);
    });
   //服务器
   std::unique_ptr<kzz::TcpServer> ser=std::make_unique<kzz::TcpServer>(port,
    [&pro](std::shared_ptr<Socket> &client_fd, InetAddr &client_addr){
        pro->GetRequest(client_fd,client_addr);
    });



   ser->Start();

    // 实现通信功能
    // kzz::ThreadPool<task_t> tp;
    //  kzz::ThreadPool<task_t>& tp=*kzz::ThreadPool<task_t> ::GetInstance();
    //  tp.Start();
    // 实现
    //  kzz::Route r;
    //  kzz::Dict d;
    //   uint16_t port=std::stoi(argv[1]);
    //  d.LoadDict();
    //  Command cmd;
    // 翻译模块
    // 传入的函数应该是让翻译模块去翻译
    // 把客户端传来的翻译任务推入线程池
    //  std::unique_ptr<kzz::TcpServer> tsver=std::make_unique<kzz::TcpServer> (port,
    //         [&cmd](const std::string &c, kzz::InetAddr &addr)
    //  {
    //      //std::string ret=kzz::Dict::TransLate(word,addr);
    //      return cmd.Execute(c,addr);
    //  }
    //      [&d](const std::string &word, InetAddr &addr)
    //  {
    //      //std::string ret=kzz::Dict::TransLate(word,addr);
    //      return d.TransLate(word,addr);
    //  }
    // );
    // //tsver->Init();
    // tsver->Start();

    // sleep(10000);

    //    tp.Stop();
    //    tp.Join();

    // 服务器的function就是把收到的任务通过route的massageroute函数进行回调，
    // 把这个回调的操作放入线程池中，让不同的线程去完成不同的回调

    //     std::unique_ptr<UdpServer> asver=std::make_unique<kzz::UdpServer>(port,
    //         [&r,&tp](int sockfd,const std::string& word,InetAddr& addr){
    //             task_t t=[&r,&sockfd,&word,&addr](){r.MassageRoute(sockfd,word,addr);};
    //             tp.Equeue(t);
    //         });
    // asver->Init();
    // asver->Start();

    //         sleep(10000);

    //    tp.Stop();
    //    tp.Join();
    //     // server.Init();

    // server.Start();
    return 0;
}